// eslint-disable
export const isObject = (obj) => {
  return obj ? Object.prototype.toString.call(obj) === '[object Object]' : false
}
export const isArray = (arr) => {
  return arr ? Array.isArray(arr) : false
}
/**
 * handle async await
 * @param {*} promise promise
 */
export const awaitWrap = (promise) => promise.then((res) => [null, res]).catch((err) => [err, {}])
/**
 * 深拷贝
 * @param {*} source
 */
export const deepClone = (source) => {
  if (!isObject(source) && !isArray(source)) return source
  const targetObj = isArray(source) ? [] : {} // 判断复制的目标是数组还是对象
  for (let keys in source) {
    // 遍历目标
    if (source.hasOwnProperty(keys)) {
      if (source[keys] && typeof source[keys] === 'object') {
        // 如果值是对象，就递归一下
        targetObj[keys] = isArray(source[keys]) ? [] : {}
        targetObj[keys] = deepClone(source[keys])
      } else {
        // 如果不是，就直接赋值
        targetObj[keys] = source[keys]
      }
    }
  }
  return targetObj
}
/**
 * @description JS对象深度合并
 * @param {object} target 需要拷贝的对象
 * @param {object} source 拷贝的来源对象
 * @returns {object|boolean} 深度合并后的对象或者false（入参有不是对象）
 */
export const deepMerge = (target = {}, source = {}) => {
  target = deepClone(target)
  if (typeof target !== 'object' || typeof source !== 'object') return false
  for (const prop in source) {
    if (!source.hasOwnProperty(prop)) continue
    if (prop in target) {
      if (typeof target[prop] !== 'object') {
        target[prop] = source[prop]
      } else if (typeof source[prop] !== 'object') {
        target[prop] = source[prop]
      } else if (target[prop].concat && source[prop].concat) {
        target[prop] = target[prop].concat(source[prop])
      } else {
        target[prop] = deepMerge(target[prop], source[prop])
      }
    } else {
      target[prop] = source[prop]
    }
  }
  return target
}
/**
 * 将File对象转为 Blob Url
 * @param {File} File对象
 * @returns Blob Url
 */
export const fileToBlob = (file) => {
  if (!file) return
  const fileType = file.type
  const blob = new Blob([file], { type: fileType || 'application/*' })
  const blobUrl = window.URL.createObjectURL(blob)
  return blobUrl
}
/**
 * 将File对象转为 base64
 * @param {File} File对象
 * @returns base64
 */
export const fileToBase64 = (file) => {
  if (!file) return
  return new Promise((r, j) => {
    const reader = new FileReader()
    reader.onloadend = () => {
      const base64String = reader.result
      r(base64String)
    }
    reader.onerror = () => {
      j({ mode: 'fileToBase64', data: { errMsg: 'File to base64 fail.' } })
    }
    reader.readAsDataURL(file)
  })
}
/**
 * base64转临时路径(改自https://github.com/zhetengbiji/image-tools/blob/master/index.js)
 * @param base64
 * @returns
 */
function dataUrlToBase64(str) {
  var array = str.split(',')
  return array[array.length - 1]
}
function biggerThan(v1, v2) {
  var v1Array = v1.split('.')
  var v2Array = v2.split('.')
  var update = false
  for (var index = 0; index < v2Array.length; index++) {
    var diff = v1Array[index] - v2Array[index]
    if (diff !== 0) {
      update = diff > 0
      break
    }
  }
  return update
}
var index = 0
function getNewFileId() {
  return Date.now() + String(index++)
}
export const base64ToPath = (base64, name = '') => {
  return new Promise((r, j) => {
    if (typeof plus !== 'object') {
      return j(new Error('not support'))
    }
    var fileName = ''
    if (name) {
      const names = name.split('.')
      const extName = names.splice(-1)
      fileName = `${names.join('.')}-${getNewFileId()}.${extName}`
    } else {
      const names = base64.split(',')[0].match(/data\:\S+\/(\S+);/)
      if (!names) {
        j(new Error('base64 error'))
      }
      const extName = names[1]
      fileName = `${getNewFileId()}.${extName}`
    }
    var basePath = '_doc'
    var dirPath = 'uniapp_save'
    var filePath = `${basePath}/${dirPath}/${fileName}`
    if (
      !biggerThan(
        plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472',
        plus.runtime.innerVersion,
      )
    ) {
      plus.io.resolveLocalFileSystemURL(
        basePath,
        function (entry) {
          entry.getDirectory(
            dirPath,
            {
              create: true,
              exclusive: false,
            },
            function (entry) {
              entry.getFile(
                fileName,
                {
                  create: true,
                  exclusive: false,
                },
                function (entry) {
                  entry.createWriter(function (writer) {
                    console.log('entry成功9999：' + filePath)
                    console.log('toLocalURL', entry.toLocalURL())
                    writer.onwrite = function () {
                      // r(filePath)
                      r(entry.toLocalURL())
                    }
                    writer.onerror = j
                    writer.seek(0)
                    writer.writeAsBinary(dataUrlToBase64(base64))
                  }, j)
                },
                j,
              )
            },
            j,
          )
        },
        j,
      )
      return
    }
    var bitmap = new plus.nativeObj.Bitmap(fileName)
    bitmap.loadBase64Data(
      base64,
      function () {
        bitmap.save(
          filePath,
          {},
          function () {
            bitmap.clear()
            console.log('保存图片成功：' + filePath)
            r(filePath)
          },
          function (error) {
            bitmap.clear()
            j(error)
          },
        )
      },
      function (error) {
        bitmap.clear()
        j(error)
      },
    )
  })
}

// 将 base64 转换为 file对象
export function base64ToFile(base64Data, filename) {
  // 将base64的数据部分提取出来
  const parts = base64Data.split(';base64,')
  const contentType = parts[0].split(':')[1]
  const raw = window.atob(parts[1])

  // 将原始数据转换为Uint8Array
  const rawLength = raw.length
  const uInt8Array = new Uint8Array(rawLength)
  for (let i = 0; i < rawLength; ++i) {
    uInt8Array[i] = raw.charCodeAt(i)
  }

  // 使用Blob对象创建File对象
  const blob = new Blob([uInt8Array], { type: contentType })
  const file = new File([blob], filename, { type: contentType })
  return {
    blob,
    file,
  }
}
